package br.com.dao;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import com.sun.jndi.ldap.ManageReferralControl;

import br.com.connection.Connection;
import br.com.model.Edital;
import br.com.model.Lance;
import br.com.model.Login;
import br.com.model.Usuario;

public class UsuarioDao {

	public static boolean salvarUsuario(Usuario usuario, Login login) {
		EntityManager manager = Connection.criarConexao();
		try {

			manager.getTransaction().begin();
			usuario.setIsAtivo(1);
			manager.persist(usuario);
			manager.getTransaction().commit();

			login.setIsAtivo(1);

			login.setUsuario(usuario);
			LoginDao.cadastrarLogin(login);
			
			manager.close();

		} catch (Exception e) {
			System.out.println("Erro" + e);
			return false;
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return true;
	}

	public static boolean alterarUsuario(Usuario usuario) {
		EntityManager manager = Connection.criarConexao();
		try {

			manager.getTransaction().begin();
			manager.merge(usuario);
			manager.getTransaction().commit();
			manager.close();
		} catch (Exception e) {
			System.out.println("Erro" + e);
			return false;
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return true;
	}

	public static boolean excluirUsuario(Usuario usuario, Login login) {
		EntityManager manager = Connection.criarConexao();
		try {

			manager.getTransaction().begin();
			usuario.setIsAtivo(0);
			manager.merge(usuario);

			login.setIsAtivo(0);
			manager.merge(login);
			manager.getTransaction().commit();
			manager.close();
		} catch (Exception ex) {
			System.out.println("Erro: " + ex);
			return false;
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return true;
	}

	public static ArrayList<Usuario> listarTodosUsuarios() {
		ArrayList<Usuario> lista = new ArrayList<>();
		EntityManager manager = Connection.criarConexao();
		try {

			manager.getTransaction().begin();
			CriteriaBuilder cb = manager.getCriteriaBuilder();
			CriteriaQuery<Usuario> cu = cb.createQuery(Usuario.class);
			Root<Usuario> ru = cu.from(Usuario.class);
			cu.select(ru);
			Predicate predicate = cb.equal(ru.get("isAtivo"), 1);
			cu.where(predicate);
			TypedQuery<Usuario> query = manager.createQuery(cu);
			lista = (ArrayList<Usuario>) query.getResultList();
			manager.getTransaction().commit();
			manager.close();

		} catch (Exception e) {
			System.out.println("Erro" + e);
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return lista;
	}

	public static Usuario pesquPorId(int id) {
		Usuario usuario = new Usuario();
		EntityManager manager = Connection.criarConexao();
		try {

			usuario = manager.find(Usuario.class, id);
			manager.getTransaction().commit();
			manager.close();

		} catch (Exception e) {
			System.out.println("Erro" + e);
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return usuario;
	}

	public static Usuario pesquPorUsername(String cpf, EntityManager manager) {
		Usuario usuario = new Usuario();
		try {

			CriteriaBuilder cb = manager.getCriteriaBuilder();
			CriteriaQuery<Usuario> u = cb.createQuery(Usuario.class);
			Root<Usuario> ru = u.from(Usuario.class);
			u.select(ru);
			Predicate predicate = cb.equal(ru.get("Cpf_Cnpj"), cpf);
			u.where(predicate);
			TypedQuery<Usuario> query = manager.createQuery(u);
			usuario = query.getSingleResult();
			manager.getTransaction().commit();
			manager.close();

		} catch (Exception e) {
			System.out.println("Erro" + e);
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return usuario;
	}

	public static Login pesquisarLogin(int id) {
		EntityManager manager = Connection.criarConexao();
		Login login = new Login();
		try {

			manager.getTransaction().begin();
			Query query = manager
					.createQuery("from Login where usuario.idUsuario = :id");

			query.setParameter("id", id);
			login = (Login) query.getSingleResult();
			manager.getTransaction().commit();
			manager.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (manager.isOpen()) {
				manager.close();
			}
		}
		return login;

	}
}
